//jdk用的是：D:\JAVA-jdk\corretto-1.8.0_312
//系统Path环境变量配的是：D:\JAVA-jdk\corretto-1.8.0_312\bin
//JAVA_HOME：D:\JAVA-jdk\corretto-1.8.0_312
import java.lang.System;
import java.net.URL;
import java.net.URLDecoder;
import sun.misc.Launcher;

//所有命令执行在：PS E:\桌面\JAVA面试\Java语法_JDK工具类_框架学习\基础语法\类加载器\src>
//这个目录就是Application类加载器的默认classpath，回去这个路径里面找文件


//初步测试执行下面的编译运行命令：
//编译：
//javac -source 1.8 -target 1.8 -encoding UTF-8  org/lang/TestClass.java 类加载器测试.java
//运行：
//java 类加载器测试

public class 类加载器测试
{
    public static void main(String[] args) throws Exception
    {
        ClassLoader classLoader=类加载器测试.class.getClassLoader();
        System.out.println(classLoader);//sun.misc.Launcher$AppClassLoader@18b4aac2
        //这里使用的是Application类加载器，会扫描classpath（这里）下的文件
        URL  url=classLoader.getResource("org/lang/TestClass.class");
        System.out.println( URLDecoder.decode(url.toString(), "UTF-8"));// file:/E:/桌面/JAVA面试/Java语法_JDK工具类_框架学习/基础语法/类加载器/src/org/lang/TestClass.class
        url=classLoader.getResource("TestFile.txt");
        System.out.println( URLDecoder.decode(url.toString(), "UTF-8"));// file:/E:/桌面/JAVA面试/Java语法_JDK工具类_框架学习/基础语法/类加载器/src/TestFile.txt

        url=classLoader.getResource("org/huang/TestClass.class");
        if(url!=null){
            //编译和运行需要下面的命令，否则为null
            //编译：
            //javac -source 1.8 -target 1.8 -encoding UTF-8 -cp ".;../other" org/lang/TestClass.java ../other/org/huang/TestClass.java 类加载器测试.java
            //.;../other表示当前路径（E:\桌面\JAVA面试\Java语法_JDK工具类_框架学习\基础语法\类加载器\src）和../other（E:\桌面\JAVA面试\Java语法_JDK工具类_框架学习\基础语法\类加载器\other）这俩路径是类路径
            //运行：
            //java -cp ".;../other" 类加载器测试
            System.out.println(URLDecoder.decode(url.toString(), "UTF-8"));// file:/E:/桌面/JAVA面试/Java语法_JDK工具类_框架学习/基础语法/类加载器/other/org/huang/TestClass.class
            url=classLoader.getResource("files/OtherTestFile.txt");
            System.out.println(URLDecoder.decode(url.toString(), "UTF-8"));// file:/E:/桌面/JAVA面试/Java语法_JDK工具类_框架学习/基础语法/类加载器/other/files/OtherTestFile.txt
        }


        /*
         String.class 属于 Java 核心类库（rt.jar 或模块 java.base），由 Bootstrap ClassLoader（引导类加载器） 加载。
         而：Bootstrap ClassLoader 是用 C/C++ 实现的、属于 JVM 内部的一部分，不是普通的 Java 对象，
         因此在 Java 层面上 无法返回一个 ClassLoader 实例引用。Java 规范规定：当类是由引导类加载器加载时，Class.getClassLoader() 方法返回 null。
        */
        classLoader=String.class.getClassLoader();
        System.out.println(classLoader);

         classLoader=类加载器测试.class.getClassLoader().getParent();
         System.out.println(classLoader);//sun.misc.Launcher$ExtClassLoader@6d06d69c


          System.out.println("【Bootstrap ClassLoader 加载路径】");
          URL[] urls = Launcher.getBootstrapClassPath().getURLs();
          for (URL u : urls) {
            System.out.println(u);
          }

          System.out.println("【Extension ClassLoader 加载路径】");
          System.out.println(System.getProperty("java.ext.dirs"));//直接把jar、字节码等资源放在这里，就可以自动扫描，直接用

          System.out.println("【Application ClassLoader 加载路径】");
          System.out.println(System.getProperty("java.class.path"));//直接把jar、字节码等资源放在这里，就可以自动扫描，直接用

    }
}
